Итак, мы научились проверять условие, получать "да" или "нет", и в зависимости от результата выполнять нужные операторы.
Что делать, если вариантов больше двух?
В языке С имеется специальный оператор множественного выбора:
switch(mark) //оценка
{
case 5: printf("\nOtlichno"); break;
case 4: printf("\nHorosho"); break;
case 3: printf("\nTak sebe. Na samom dele - ");
case 2:
case 1: printf("\nPloho"); break;
default: printf("\nTakih ocenok ne byvaet!"); break;
}
Что мы видим из этого примера?
  • Проверяются несколько условий, но все условия вида "переменная == константа". Переменная задана в строке switch, а константы - в строках case. Проверка ведется на точное совпадение, сверху вниз.
  • Если совпадение произошло, выполняются операторы до конца блока switch - или до оператора break. Если мы не хотим, чтобы выполнение продолжалось для других меток case - ставим break.
Соответственно, в нашем примере слово "Ploho" напечатается для оценок 3, 2 и 1.
  • В конце оператора switch может стоять метка default (по умолчанию). Все случаи, не совпавшие с метками case, будут идти на default.

И что не видим:
  • На самом деле, метки оператора switch могут быть только константами, причем целочисленными (это включает в себя и одиночные символы). То есть проверять совпадение строк этим оператором нельзя.

Ограничения, накладываемые оператором switch, довольно серьезны. Так, например, функцию, заданную такой системой, запрограммировать с его помощью нельзя:
/sin(x), при x <0
y= {x, при 0<=x <1
\1, иначе

?? эту задачу можно решить с помощью оператора if ??
На самом деле, если б последняя строка была записана как
1, 1<=x
то можно было бы применить тупой (но рабочий) способ - запрограммировать каждую строчку отдельным оператом if.
if (x<0) y=sin(x);
if (0<=x && x<1) y=x;
if (1<=x) y=1;

Нетрудно видеть, что условия не пересекаются, т.е. для любого x сработает только одна строчка.
Единственная проблема в том, что у нас получилось на один if и два условия больше, чем могло бы быть.
Поэтому мы рассмотрим более красивый способ - вложенные if.
if (x<0) 
    y=sin(x)
else if (x<1) 
        y=x
    else
        y=1;

Что на самом деле присходит, легко понять с помощью блок-схемы:
<блок-схема>

Мы не проверяем 0<=x, потому что все x<0 ушли на первое условие.
У нас нет третьего if, потому что на третью строку системы попадает все, что осталось от первых двух.
Тем не менее, подобная запись имеет недостаток. Если мы имеем много вложенных if, трудно понять к какому if относится какой else.
Например:
if (x<0) 
    y=sin(x)
    if (x<1) 
        y=x
    else
        y=1;

<идея неплохая но где-то я наврал - надо посмотреть внимательно>